Socket 통신

NOTE

소켓 통신의 기초와 동기/비동기 · 블로킹/논블로킹 개념 정리.

NOTE

원문을 AI가 검토·보강함(사실 확인 권장).

📌 개념

Windows 소켓 (winsock2.h)

  • WSAStartup(버전, pointer) == 0 이면 성공(success)
  • socket(AF_INET, SOCK_STREAM, protocol) ⇒ IPv4, TCP/IP 프로토콜 이용

동기 vs 비동기

NOTE

작업 완료 여부에 신경을 쓰냐 / 안 쓰냐의 차이

  • 동기: 작업이 끝나는 것과 시작이 순차적 흐름으로 이어짐 (순차적인 흐름만 지켜지면 됨)
  • 비동기: 시작과 종료 시점이 일치하지 않음

블로킹 vs 논블로킹

NOTE

제어권이 누구에게 있냐? (제어권 = 코드 흐름의 주체)

  • 블로킹: 자신의 작업을 진행하다 다른 주체의 작업이 시작되면, 그 주체가 끝날 때까지 기다렸다가 자신의 작업 수행
  • 논블로킹: A 함수가 B 함수를 호출해도 기다리지 않고 자신의 작업을 계속 수행

조합 (동기/비동기 + 블로킹/논블로킹)

  1. sync + 블로킹: 제어권이 넘어가면 기다림
  2. sync + 논블로킹: 제어권이 안 넘어가고 B 함수 결과가 나왔는지 중간중간 물어봄
    • mutex ⇒ thread 동기화를 도와주는 함수 (sync 부분 → 계속 질의)
    • 공유 자원 공간에 대한 접근 시간 제어
  3. async + 논블로킹: B 함수 호출 시 callback 함수도 같이 넘김 (완료 시 callback으로 A 함수에 통보)
  4. async + 블로킹: callback을 전달하나 B 함수가 끝날 때까지 대기 (sync+블로킹과 성능차가 없어 잘 사용하지 않음)

NOTE

MUTEX vs SPINLOCK

  • MUTEX: 다른 프로세스가 진행 중이면 기다림 + 프로세스가 끝난 걸 알려줘야 실행
  • SPINLOCK: 다른 프로세스를 기다리는 것은 동일하나, 끝나는 즉시 바로 진행

예시 시나리오 (화장실 자물쇠 비유)

  1. A: 자물쇠 확인 → 화장실 들어감
  2. 화장실: 좌물쇠 잠금(A) → 용무 시작
  3. B: 화장실 진입 시도 → 자물쇠가 잠겨 있어 기다림
    • 스핀락: 밖에서 계속 기다림 (풀렸는지 반복 확인)
    • 뮤텍스: 화장실 밖에서 잠듦 (통지를 받을 때까지 대기)
  4. 화장실: 용무 마무리 → 자물쇠를 품(A) → 화장실에서 나감
    • 뮤텍스: A가 화장실 밖에서 잠든 B를 깨움
    • 스핀락: B가 바로 자물쇠를 확인해 곧장 잠금
  5. 화장실: 좌물쇠 잠금(B) → 용무 시작 → 용무 마무리 → 자물쇠를 품(B) → 화장실에서 나감

🔗 참고